69 岁的 Java 之父退休了!近亿人因他受益
近日,Java 语言之父 James Gosling 在领英上发文宣布自己即将退休。他在博文中写道:“我现在终于退休了。干了这么多年软件工程师,是时候享受生活了。尽管曾经经历过疫情肆虐、业界萧条,但在亚马逊的过去七年里,我过得非常愉快。我还有很多未尽事宜要去完成,我将满怀期待开启新征程”。
Java 的故事始于 1991 年,当时 Sun Microsystems 试图将其在计算机工作站市场的领先地位扩展到新兴且发展迅速的个人电子产品市场。几乎没有人预料到 Sun 即将创建的编程语言会使计算大众化,激发了一个全球范围的社区,并成为了一个由语言、运行时平台、SDK、开源项目以及许多工具组成的持久软件开发生态系统的平台。
经过 James Gosling 领导团队数年秘密开发后,Sun 于 1995 年发布了具有里程碑意义的“一次编写,随处运行” 的 Java 平台,并将重点从最初的交互式电视系统设计转到了新兴的万维网应用程序上。在本世纪初,Java 就已经开始为从智能卡到太空飞行器的一切制作动画了。如今,数以百万计的开发人员在使用 Java 编程,它至今仍然是工业界最受欢迎和使用最多的语言。
Java 语言源于 1991 年 Sun 公司 James Gosling 领导的的 Ork 项目,1995 年 Sun 公司正式起名为 Java,并提出“Write once, Run anywhere"的口号。
1996 年 1 月 Java 1.0 发布,提供了一个解释执行的 Java 虚拟机,其时恰逢互联网开始兴起,Java 的 Applet 能在 Mozilla 浏览器中运行,被看作是未来的互联网语言。
1997 年 2 月 Java 1.1 发布,Java 语言的基本形态基本确定了,比如反射 (reflection), JavaBean,接口和类的关系等等,一直到今天都保持一致。然而,Java 最初的一些目标,如在浏览器中执行 Applet,以及跨平台的图形界面 Awt 很快遭遇到负面的评价。
1998 年 12 月,Java 第一个里程碑式的版本,即 Java 1.2 发布了。这个版本使用了 JIT(Just in time)编译器技术,使得语言的可迁移性和执行效率达到最优的平衡,同时 Collections 集合类设计优良,在企业应用开发中迅速得到了广泛使用。Sun 公司把 Java 技术体系分成三个方向,分别是 J2SE(面向桌面和通用应用开发),J2EE(面向企业级应用开发),J2ME(面向移动终端开发)。这个分类影响非常久远,体现出主流语言设计者的思想:针对于不同的应用领域,在形态,API 集合等进行划分。
2000 年 5 月,Java 1.3 发布,这个版本中 Corba 作为语言级别的分布式对象技术,成为 J2EE 的一个技术前提。J2EE 受到 Corba 的设计的影响较大,早期 EJB 的 Home,接口和实现就是 Corba 在 C 语言的实现,被移植到 Java 语言之中。J2EE 中的 Servlet 规范获得了极大的成功,伴随着互联网的兴起,和浏览器直接通过 HTTP 协议交互的 Servlet,和众多的 MVC 框架,成为 Web1.0 的网红。
2002 年 2 月,Java 1.4 发布,Java 语言真正走向成熟,提供了非常完备的语言特性,如 NIO,正则表达式,XML 处理器等。同年微软的.NET 框架发布,两者开始了为期十几年的暗自竞争。从语言特性上来说,.NET 后发先至,一直处于优势。但 Java 依赖良好的开发者生态,绝大多数大型软件公司的使用者众多和不断贡献,以及对 Linux 操作系统良好的支持,渐渐的在服务器端获得优势地位。
2004 年 9 月,Java 5 发布,Sun 不再采用 J2SE, J2EE 这种命名方式,而使用 Java SE 5, Java EE 5 这样的名称。我认为 Java 5 是第二个里程碑式的版本。Java 语言语法发生很大的变化,如注解 (Annotation),装箱 (Autoboxing),泛型 (Generic),枚举 (Enum),foreach 等被加入,提供了 java.util.concurrent 并发包。Java 5 对于 Java 语言的推动是巨大的,特别是注解的加入,使得语言定义灵活了很多,程序员可以写出更加符合领域定义的描述性程序。
2006 年 5 月, JavaEE 5 发布,其中最主要是 EJB3.0 的版本升级。在此之前,EJB2.X 版本被广泛质疑,SpringFramework 创建者 Rod Johnson 在经典书籍“J2EE Development without EJB“中,对 EJB2 代表的分布式对象的设计方法予以批驳。EJB3 则重新经过改造,使用注解方式,经过应用服务器对 POJO 对象进行增强来实现分布式服务能力。在某种程度,可以说 EJB3 挽救了 JavaEE 的过早消亡。
2006 年 12 月,Java 6 发布,这个语言语法改进不多,但在虚拟机内部做了大量的改进,成为一个相当成熟稳定的版本,时至今日国内的很多公司依然以 Java6 作为主要 Java 开发版本来使用。同年 Sun 公司做出一个伟大的决定,将 Java 开源。OpenJDK 从 Sun JDK 1.7 版本分支出去,成为今天 OpenJDK 的基础。OpenJDK6 则由 OpenJDK7 裁剪而来,目前由红帽负责维护,来满足 Redhat Enterprise Linux 6.X 用户的需要。
2009 年 12 月,JavaEE 6 发布,这个版本应该说是 JavaEE 到目前为止改进最大影响最深远的一个版本。因为 JavaEE5 只有 EJB3 适应了 Java 注解语法的加入,而 EE6 全面接纳了注解。CDI 和 BeanValidation 规范的加入,在 POJO 之上可以定义完备的语义,由容器来决定如何去做。Servlet 也升级到 3.0 版本,并在接口上加入异步支持,使得系统整体效率可以大幅提高。EE 划分为 Full Profile 和 Web Profile,用户可以根据自己的需要选择不同的功能集。
在此之前,Oracle 已经以 74 亿美金的价格收购了 Sun 公司,获得了 Java 商标和 Java 主导权。也收购了 BEA 公司,获得市场份额最大的应用服务器 Webogic。JavaEE 6 虽然是收购之后发布的版本,但主要的设计工作仍然由原 Sun 公司的 Java 专家完成。
2011 年 7 月,Oracle 发布 Java 7, 其中主要的特性是 NIO2 和 Fork/Join 并发包,尽管语言上没有大的增强,但我个人认为,自从 Oracle JDK(包括 OpenJDK7),Java 虚拟机的稳定性真正做到的工业级,成为一个计算平台而服务于全世界。
2013 年 6 月,Oracle 发布 JavaEE 7,这个版本加入了 Websocket,Batch 的支持,并且引入 Concurrency 来对服务器多线程进行管控。然而所有的子规范,算上可选项 (Optional) 总共有 40 多项,开发者光是阅读规范文本就很吃力了,更不要说能够全局精通掌握。JavaEE 规范的本质是企业级应用设计的经验凝结,每一个 API 都经过众多丰富经验的专家反复商议并确定。各个版本之间可以做到向后兼容,也就是说,即使是 10 年前写的 Servlet 程序,当前的开发者也可以流畅的阅读源码,经过部分代码调整和配置修改,可以部署在当今的应用服务器上。反过来,今后用 Servlet4 写的程序,浏览器和服务器通信使用全新的 HTTP/2 协议,但程序员在理解上不会有障碍,就是因为 Servlet 规范的 API 非常稳定,基本没有大的变化修改。
2014 年 3 月,Oracle 发布 Java 8,这个版本是我认为的第三个有里程碑意义的 Java 版本。其中最引人注目的便是 Lambda 表达式了,从此 Java 语言原生提供了函数式编程能力。语言方面大的特性增加还有:Streams,Date/Time API, 新的 Javascript 引擎 Nashorn,集合的并行计算支持等,Java8 更加适应海量云计算的需要。
按照原来的计划,Java 9 JDK 版本应该在 2017 年 7 月发布,但因为模块化 (JPMS) 投票未通过的原因,推迟到 2017 年 9 月份发布。
也正是从这个版本后,Java 迎来了版本快速迭代期。此后,JDK 更新版本的速度令开发者应接不暇,几乎每半年就有一个版本,虽然 Oracle 的目的是好的,为了避免因功能增加而引发的跳票风险,但不得不承认,版本更新的节奏实在是有点过于频繁。
这就导致一个问题,好不容易更新一个版本,用了六个月后,Oracle 不维护了。针对这个问题,Oracle 给出的解决方案是每六个 JDK 大版本才会被长期支持(Long Term Support,LTS)。
2018 年 9 月 25 日,JDK 11 版本发布。
2021 年 JDK 17 版本发布,这也是一个长期支持版本。JDK 12、JDK 13、JDK 14、JDK 15、JDK 16、JDK 18、JDK 19 都是过渡产品,就好像是试验品一样,不太受开发者欢迎。
今年 3 月份,Oracle 正式发布 Java 22。据悉,全新的 Java 版本提供 12 个 JDK 增强建议,有助于优化 Java 语言并提升开发平台的性能、稳定性和安全性,包括对 Java 语言、其 API 和性能,以及 Java 开发工具包(JDK)中工具的增强功能,以帮助开发人员提高工作效率。
历经 20 多年的发展,Java 至今仍然是开发者心目中 Top 3 的编程语言。在今年 3 月公布的 IEEE Spectrum 2023 年度编程语言排行榜中,Java 仅居 Python 之后位列次席。自 1995 年诞生以来,Java 始终是互联网行业炙手可热的编程语言。
此前,InfoQ 有幸对 Java 之父 James Gosling 博士进行了一次独家专访。在采访中,James Gosling 谈到了 Java 的诞生与发展、他对众多编程语言的看法、编程语言的未来发展趋势以及云计算带来的改变等问题。
以下为访谈实录,经编辑。
James Gosling:Java 的诞生其实源于物联网的兴起。当时,我在 Sun 公司工作,同事们都觉得嵌入式设备很有发展前景,而且随着设备数量的激增,整个世界正逐渐向智能化的方向发展。我们投入大量时间与不同行业的从业者进行交流,也拜访了众多东南亚、欧洲的从业者,结合交流心得和行业面临的问题,决定构建一套设计原型。正是在这套原型的构建过程中,我们深刻地意识到当时主流的语言 C++ 存在问题。
最初,我们只打算对 C++ 做出一点小调整,但随着工作的推进、一切很快“失控”了。我们构建出不少非常有趣的设备原型,也从中得到了重要启示。因此,我们及时对方向进行调整,希望设计出某种适用于主流业务和企业计算的解决方案,这正是一切故事的开端。
James Gosling:Java 得以拥有顽强的生命力背后有诸多原因。
首先,采用 Java 能够非常便捷地进行多线程编程,能大大提升开发者的工作效率。
其次,Java 提供多种内置安全功能,能够帮助开发者及时发现错误、更加易于调试,此外,各种审查机制能够帮助开发者有效识别问题。
第三,热修复补丁功能也非常重要,亚马逊开发者开发出的热补丁修复程序,能够在无须停机的前提下修复正在运行的程序,这是 Java 中非常独特的功能。
第四,Java 拥有很好的内存管理机制,自动垃圾收集大大降低了内存泄露或者双重使用问题的几率。总之,Java 的设计特性确实提升了应用程序的健壮性,特别是极为强大的现代垃圾收集器方案。如果大家用过最新的长期支持版本 JDK17,应该对其出色的垃圾收集器印象深刻。新版本提供多种强大的垃圾收集器,适配多种不同负载使用。另外,现代垃圾收集器停顿时间很短、运行时的资源消耗也非常低。如今,很多用户会使用体量极为庞大的数据结构,而只要内存能容得下这种 TB 级别的数据,Java 就能以极快的速度完成庞大数据结构的构建。
James Gosling:对继续坚守 Java8 的朋友,我想说“是时候作出改变了”。新系统全方位性更强、速度更快、错误也更少、扩展效率更高。无论从哪个角度看,大家都有理由接纳 JDK17。确实,大家在从 JDK8 升级到 JDK9 时会遇到一个小问题,这也是 Java 发展史中几乎唯一一次真正重大的版本更替。大多数情况下,Java 新旧版本更替都非常简单。只需要直接安装新版本,一切就能照常运作。长久以来,稳定、非破坏性的升级一直是 Java 的招牌特性之一,我们也不希望破坏这种良好的印象。
James Gosling: 这其实是一种博弈。真正重要的是 Java 能不能以更便利的方式完成任务。我们没办法设想,如果放弃某些问题域,Java 会不会变得更好?或者说,如果我现在重做 Java,在取舍上会有不同吗?区别肯定会有,但我估计我的取舍可能跟大多数人都不一样,毕竟我的编程风格也跟多数人不一样。不过总的来讲,Java 确实还有改进空间。
James Gosling: 我可太想简化一下 Java 了。毕竟简化的意义就是放下包袱、轻装上阵。所以 JavaScript 刚出现时,宣传的就是精简版 Java。但后来人们觉得 JavaScript 速度太慢了。在 JavaScript 的早期版本中,大家只是用来执行外部验证之类的简单事务,所以速度还不太重要。但在人们打算用 JavaScript 开发高性能应用时,得出的解决方案就成了 TypeScript。其实我一直觉得 TypeScript 的定位有点搞笑——JavaScript 就是去掉了 Type 的 Java,而 TypeScript 在 JavaScript 的基础上又把 type 加了回来。Type 系统有很多优势,特别是能让系统运行得更快,但也确实拉高了软件开发者的学习门槛。但如果你想成为一名专业的软件开发者,那最好能克服对于学习的恐惧心理。
James Gosling: 我个人还是会用最简单的评判标准即这种语言能不能改善开发者的日常工作和生活。我尝试过很多语言,哪种更好主要取决于我想干什么。如果我正要编写低级设备驱动程序,那我可能倾向于选择 Rust。但如果需要编写的是用来为自动驾驶汽车建立复杂数据结构的大型导航系统,那我几乎肯定会选择 Java。
James Gosling: 我是领域特定语言的铁粉,也深切认同这些语言在特定领域中的出色表现。大多数领域特定语言的问题是,它们只能在与世隔绝的某一领域中发挥作用,而无法跨越多个领域。这时候大家更愿意选择 Java 这类语言,它虽然没有针对任何特定领域作出优化,但却能在跨领域时表现良好。所以,如果大家要做的是任何形式的跨领域编程,肯定希望单一语言就能满足所有需求。有时候,大家也会尝试其他一些手段,希望在两种不同的领域特定语言之间架起一道桥梁,但一旦涉及两种以上的语言,我们的头脑通常就很难兼顾了。
James Gosling: 在我看来,Rust 太过关注安全了,这让它出了名的难学。Rust 解决问题的过程就像是证明定理,一步也不能出错。如果我们只需要编写一小段代码,用于某种固定不变的设备,那 Rust 的效果非常好。但如果大家需要构建一套具有高复杂度动态数据结构的大规模系统,那么 Rust 的使用难度就太高了。
James Gosling: 要具体问题具体分析。我到底需要 Rust 中的哪些功能特性?我又需要 Java 中的哪些功能特性?很多人更喜欢 Python,因为它的学习门槛真的很低。但跑跑基准测试,我们就会发现跟 Rust 和 Java 相比,Python 的性能实在太差了。如果关注性能,那 Rust 或 Java 才是正确答案。另外,如果你需要的是只有 Rust 能够提供的那种致密、安全、严谨的特性,代码的编写体量不大,而且一旦出问题会造成严重后果,那 Rust 就是比较合适的选择。只能说某些场景下某些语言更合适。Java 就属于比较折衷的语言,虽然不像 Python 那么好学,但也肯定不算难学。
James Gosling: 我刚刚入行时,市面上已经有很多语言了。我学了不少语言,大概有几十种吧。但很多语言的诞生本身就很荒谬、很没必要。很多语言就是同一种语言的不同方言,因为它们只是在用不同的方式实现基本相同的语言定义。最让我振奋的是我生活在一个能够致力于解决问题的世界当中。Java 最大的吸引力也正在于此,它能帮助我们解决几乎任何问题。具有普适性的语言地位高些、只适用于特定场景的语言则地位低些,对吧?所以到底该学什么语言,取决于你想解决什么问题、完成哪些任务。明确想要解决什么样的问题才是关键。
如今,年近古稀之年的 James Gosling 在给编程历史上留下了一部伟大的杰作后将开启自己的新旅程。
社区的开发者们都对 James Gosling 退休这件事送上祝福,在他这条官宣退休的博文中,众多开发者和企业 IT 领导者们对他在编程领域做出的贡献给予肯定和感激。
一家初创企业的 CEO & 架构师 Sam 评论道:
“据称 Java 有 1100 万名开发者,而这 1100 万名开发者开发的代码将由另外 1100 万名测试工程师和 SRE 进行测试和支持。每位工程师平均可能养活着他的 4 名家庭成员。 保守估计,这意味着 James 的职业生涯将影响 8800 万人的生计(2200 万工程师 x 4 名家庭成员)。James 的职业生涯多么辉煌,他为人类做出了多么伟大的贡献。作为这 8800 万中的一员,我从心底感谢您!祝你退休生活愉快!”
Hacker News 上的一位开发者也表示,“很少有语言能取得如此大的成功。无论大家如何看待设计决策,如此大规模的采用和部署都是相当了不起的”。
延展阅读:
https://www.infoq.cn/article/GiiczmxpRT8q0adEvcRw
德国再次拥抱Linux:数万系统从windows迁出,能否避开二十年前的“坑”?
下一代 RAG 技术来了!微软正式开源 GraphRAG:大模型行业将迎来新的升级?
专家智能体等大模型应用在哪些金融场景跑通了?通用大模型在面对大多数 TOB 场景问题时有哪些局限性?
7 月 9 日晚 20:00,InfoQ 连线度小满与文因互联知识图谱专家,预约开启智慧金融之旅!